package com.luxsoft.impapx

import grails.converters.JSON

import org.apache.commons.lang.exception.ExceptionUtils;
import org.codehaus.groovy.grails.web.json.JSONArray
import org.springframework.dao.DataIntegrityViolationException

class CuentaDeGastosController {

    static allowedMethods = [create: ['GET', 'POST'], edit: ['GET', 'POST'], delete: 'POST']
	
	def cuentaDeGastosService

    def index() {
        redirect action: 'list', params: params
    }

    def list() {
       params.sort='id'
	   params.order='desc'
        [cuentaDeGastosInstanceList: CuentaDeGastos.list(params), cuentaDeGastosInstanceTotal: CuentaDeGastos.count()]
    }

    def create() {
		switch (request.method) {
		case 'GET':
        	[cuentaDeGastosInstance: new CuentaDeGastos(fecha:new Date())]
			break
		case 'POST':
	        def cuentaDeGastosInstance = new CuentaDeGastos(params)
	        if (!cuentaDeGastosInstance.save(flush: true)) {
	            render view: 'create', model: [cuentaDeGastosInstance: cuentaDeGastosInstance]
	            return
	        }

			flash.message = message(code: 'default.created.message', args: [message(code: 'cuentaDeGastos.label', default: 'CuentaDeGastos'), cuentaDeGastosInstance.id])
	        redirect action: 'show', id: cuentaDeGastosInstance.id
			break
		}
    }

    def show() {
        def cuentaDeGastosInstance = CuentaDeGastos.get(params.id)
        if (!cuentaDeGastosInstance) {
			flash.message = message(code: 'default.not.found.message', args: [message(code: 'cuentaDeGastos.label', default: 'CuentaDeGastos'), params.id])
            redirect action: 'list'
            return
        }

        [cuentaDeGastosInstance: cuentaDeGastosInstance]
    }

    def edit() {
		switch (request.method) {
		case 'GET':
	        def cuentaDeGastosInstance = CuentaDeGastos.get(params.id)
	        if (!cuentaDeGastosInstance) {
	            flash.message = message(code: 'default.not.found.message', args: [message(code: 'cuentaDeGastos.label', default: 'CuentaDeGastos'), params.id])
	            redirect action: 'list'
	            return
	        }

	        [cuentaDeGastosInstance: cuentaDeGastosInstance]
			break
		case 'POST':
			println 'actualizando cuenta de gastos: '+params
	        def cuentaDeGastosInstance = CuentaDeGastos.get(params.id)
	        if (!cuentaDeGastosInstance) {
	            flash.message = message(code: 'default.not.found.message', args: [message(code: 'cuentaDeGastos.label', default: 'CuentaDeGastos'), params.id])
	            redirect action: 'list'
	            return
	        }

	        if (params.version) {
	            def version = params.version.toLong()
	            if (cuentaDeGastosInstance.version > version) {
	                cuentaDeGastosInstance.errors.rejectValue('version', 'default.optimistic.locking.failure',
	                          [message(code: 'cuentaDeGastos.label', default: 'CuentaDeGastos')] as Object[],
	                          "Another user has updated this CuentaDeGastos while you were editing")
	                render view: 'edit', model: [cuentaDeGastosInstance: cuentaDeGastosInstance]
	                return
	            }
	        }

			
	        cuentaDeGastosInstance.properties = params
			
	        if (!cuentaDeGastosInstance.save(flush: true)) {
	            render view: 'edit', model: [cuentaDeGastosInstance: cuentaDeGastosInstance]
	            return
	        }

			flash.message = message(code: 'default.updated.message', args: [message(code: 'cuentaDeGastos.label', default: 'CuentaDeGastos'), cuentaDeGastosInstance.id])
	        redirect action: 'show', id: cuentaDeGastosInstance.id
			break
		}
    }

    def delete() {
        def cuentaDeGastosInstance = CuentaDeGastos.get(params.id)
        if (!cuentaDeGastosInstance) {
			flash.message = message(code: 'default.not.found.message', args: [message(code: 'cuentaDeGastos.label', default: 'CuentaDeGastos'), params.id])
            redirect action: 'list'
            return
        }

        try {
            cuentaDeGastosInstance.delete(flush: true)
			flash.message = message(code: 'default.deleted.message', args: [message(code: 'cuentaDeGastos.label', default: 'CuentaDeGastos'), params.id])
            redirect action: 'list'
        }
        catch (DataIntegrityViolationException e) {
			flash.message = message(code: 'default.not.deleted.message', args: [message(code: 'cuentaDeGastos.label', default: 'CuentaDeGastos'), params.id])
            redirect action: 'show', id: params.id
        }
    }
	
	def facturasAsJSON(){
		
		def dataToRender = [:]
		dataToRender.sEcho = params.sEcho
		dataToRender.aaData=[]
		//def list=CuentaPorPagar.findAll("from CuentaPorPagar d where d.cuentaDeGastos.id=?",[params.long('cuentaDeGastosId')])
		//def list=GastosDeImportacion.findAll("select f from GastosDeImportacion g left join fetch g.facturas f where g.id=?",[params.long('cuentaDeGastosId')])
		def cuenta=CuentaDeGastos.findById(params.long('cuentaDeGastosId'),[fetch:[facturas:'select']])
		def list=cuenta.facturas
		dataToRender.iTotalRecords=list.size()
		dataToRender.iTotalDisplayRecords = dataToRender.iTotalRecords
		list.each{ row ->
			
			dataToRender.aaData <<[
				row.id
				,row.documento
				,lx.shortDate(date:row.fecha)
				,row.proveedor.nombre
				,lx.moneyFormat(number:row.importe*row.tc)
				]
			
		}
		render dataToRender as JSON
	}
	
	def facturasDisponiblesPorAsignarJSON(){
		//println 'Localizando factura para :'+params
		//def facturas=GastosDeImportacion.findAllByCuentaDeGastosIsNullAndDocumentoIlike(params.term+'%')
		def facturas=GastosDeImportacion.findAll("from GastosDeImportacion fac where fac not in(select f from CuentaDeGastos c join c.facturas f)")
		
		def res=facturas.collect{row ->
			def total=lx.moneyFormat(number:row.total)
			def label="Fac: ${row.documento}  F: ${row.fecha.format('dd/MM/yyyy')} T: ${total} Prov:${row.proveedor.nombre}"
			[id:row.id,label:label,value:label,documento:row.documento]
		}
		render res as JSON
		
	}
	
	def agregarFactura(){
		def dataToRender=[:]
		def res=cuentaDeGastosService.agregarFactura(params.long('cuentaDeGastosId'), params.long('facturaId'))
		dataToRender.total=res.total
		render dataToRender as JSON
		/*
		try{
			def res=cuentaDeGastosService.agregarFactura(params.long('cuentaDeGastosId'), params.long('facturaId'))
			dataToRender.total=res.total
		}catch(Exception ex){
			dataToRender.error=ExceptionUtils.getRootCauseMessage(ex)
		}
		render dataToRender as JSON*/
	}
		
	def eliminarFacturas(){
		//println 'Eliminando facturas: '+params
		JSONArray jsonArray=JSON.parse(params.partidas);
		def data=[:]
		try {
			def cuenta=cuentaDeGastosService.eliminarFacturas(params.cuentaDeGastosId,jsonArray)
			data.total=cuenta.total
			
		} catch (CuentaDeGastosException e) {
			e.printStackTrace()
			data.error=e.message
		}
		render data as JSON
	}
	
	def embarquesDisponiblesJSONList(){
		//def embarques=Embarque.findAllByBlIlike('%'+params.term+"%",[max:20,sort:"fechaEmbarque",order:"desc"])
		def embarques=Embarque.findAll("from Embarque e where e.id not in (select x.embarque.id from CuentaDeGastos x )")
		def embarquesList=embarques.collect { row ->
			def label=row.toString()
			[id:row.id,label:label,value:label]
		}
		render embarquesList as JSON
	}
}
